package com.brillilab.service.module.aliyun;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.brillilab.domain.vo.message.SmsSendVo;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@ConfigurationProperties(prefix="aliyun.sms")
@Data
public class AliYunSms {

	private String regionId;
	private String accessKeyId;
	private String accessKeySecret;
	private String signName;
	private String verifyCodeTemplate;
	/**
	 * 发送次数限制
	 */
	private int sendLimit;
	/**
	 * 恢复时间(s)
	 */
	private int invalidateTime;
	/**
	 * 是否打开次数限制
	 */
	private boolean sendLimitOpen;
	/**
	 * 是否真实发送
	 */
	private boolean trulySend;
	/**
	 * 模拟验证码
	 */
	private String mockValidateCode;
	/**
	 * 邀请用户注册模板
	 */
	private String inviteUserRegisterTemplate;
	/**
	 * 邀请管理员加入实验室
	 */
	private String invitePIJoinLabTemplate;
	/**
	 * 成员申请加入实验室成功
	 */
	private String memberJoinLabSuccessTemplate;
	/**
	 * 成员申请加入实验室审核未通过
	 */
	private String memberApplyJoinLabNotAdoptedTemplate;
	/**
	 * 申请创建实验室审核通过
	 */
	private String applyCreateLabAuditPassTemplate;

	/**
	 * 申请创建实验室审核未通过
	 */
	private String applyCreateLabNotAdoptedTemplate;

	/**
	 * 有新的实验室待审核
	 */
	private String haveNewLabWaitAuditTemplate;
	/**
	 * 有新实验室成员待审核
	 */
	private String haveNewLabMemberWaitAuditTemplate;

	/**
	 * 帮PI申请实验室成功
	 */
	private String helpPIApplyLabSuccessTemplate;

	/**
	 * 帮PI申请实验室成功-PI已有账号
	 */
	private String helpHaveAccountPIApplyLabSuccessTemplate;

	/**
	 * PI修改登录和数据密码成功
	 */
	private String modifyLoginAndDataPasswordSuccessTemplate;

	/**
	 * 无成员管理权限的人邀请成员成功通知PI审核
	 */
	private String noAuthInviteMemberNoticePIAuditTemplate;

	/**
	 * 无成员管理权限的人邀请成员成功通知被邀请人
	 */
	private String noAuthInviteMemberSuccessNoticeBeInviterTemplate;

	/**
	 * 申请加入实验室-实验室PI审核未通过
	 */
	private String applyJoinLabAuditNotPassTemplate;

	/**
	 * 用户主动申请加入实验室审核成功-通知PI审核
	 */
	private String applyJoinLabAuditPassNoticePIAuditTemplate;

	/**
	 * 实验室到期
	 */
	private String whenLabExpireTemplate;

	/**
	 * 用户账号到期
	 */
	private String whenUserExpireTemplate;

	/**
	 * PI分享成功实验室升级为免费版
	 */
	private String shareLabSuccessPI;

	// 产品名称:云通信短信API产品,开发者无需替换
	private String product = "Dysmsapi";
	// 产品域名,开发者无需替换
	private String domain = "dysmsapi.aliyuncs.com";
	
	/**
	 * 异步发送短信
	 * 
	 * @param smsSendVo
	 * @throws Exception
	 * 参见文档  https://help.aliyun.com/document_detail/55284.html
	 */
	@Async
	public void asyncSend(SmsSendVo smsSendVo) throws Exception{
		syncSend(smsSendVo);
	}
	
	/**
	 * 同步发送短信
	 * 
	 * @param smsSendVo
	 * @throws Exception
	 * 参见文档  https://help.aliyun.com/document_detail/55284.html
	 */
	public SendSmsResponse syncSend(SmsSendVo smsSendVo) throws ClientException {

		// 可自助调整超时时间
		System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
		System.setProperty("sun.net.client.defaultReadTimeout", "10000");
		
		// 初始化acsClient,暂不支持region化
		IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
		DefaultProfile.addEndpoint(regionId, regionId, product, domain);
		IAcsClient acsClient = new DefaultAcsClient(profile);

		// 组装请求对象-具体描述见控制台-文档部分内容
		SendSmsRequest request = new SendSmsRequest();
		// 必填:待发送手机号
		request.setPhoneNumbers(smsSendVo.getMobiles());
		// 必填:短信签名-可在短信控制台中找到
		request.setSignName(signName);
		// 必填:短信模板-可在短信控制台中找到
		request.setTemplateCode(smsSendVo.getTemplateCode());
		if(smsSendVo.getParamMap()!=null){
			String paramJson = JSONObject.toJSON(smsSendVo.getParamMap()).toString();
			// 可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
			request.setTemplateParam(paramJson);
		}

		// 选填-上行短信扩展码(无特殊需求用户请忽略此字段)
		// request.setSmsUpExtendCode("90997");

		// 可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者
		// request.setOutId("yourOutId");

		SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
		log.info(">>>>>>	短信记录发送："+smsSendVo.getTemplateCode()+"/"+smsSendVo.getMobiles()
				+"/"+sendSmsResponse.getCode()+"/"+sendSmsResponse.getRequestId()+"/"+sendSmsResponse.getMessage());
		return sendSmsResponse;
	}
}
